package com.sx.controller;

import com.sx.pojo.Person;
import com.sx.service.PersonService;
import com.sx.service.serviceImpl.PersonServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serial;
import java.sql.SQLException;
import java.util.ArrayList;

//员工信息管理
@WebServlet("/person.action")
public class PersonServlet extends HttpServlet {
    // 定义一个常量，用于标识Servlet的版本号
    @Serial
    private static final long serialVersionUID = 1L;
    // 创建业务逻辑层对象
    private final PersonService personService = new PersonServiceImpl();
    // 创建实体类对象
    private final Person person = new Person();
    // 创建日志记录器对象
    private final Logger logger = LogManager.getLogger(PersonServlet.class);

    /**
     * 处理HTTP GET请求的方法
     * 该方法根据请求参数执行不同的操作当请求参数action为"list"时，
     * 它从personService获取所有人员信息，并将其传递给personList.jsp页面，
     * 最终转发请求到index.jsp页面
     *
     * @param req  用于获取请求信息的HttpServletRequest对象
     * @param resp 用于发送响应信息的HttpServletResponse对象
     * @throws ServletException 如果Servlet遇到异常
     * @throws IOException      如果发生输入或输出异常
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求编码
        req.setCharacterEncoding("UTF-8");
        // 设置响应内容类型
        resp.setContentType("text/html;charset=UTF-8");
        // 获取请求参数action的值
        String action = req.getParameter("action");
        //获取session
        HttpSession session = req.getSession();
        Person user = null;
        if (session.getAttribute("person") == null) {
            // 重定向到登录页面
            resp.sendRedirect(req.getContextPath() + "/login");
            return;
        } else {
            user = (Person) session.getAttribute("person");
        }
        // 判断action参数是否为"list"
        switch (action) {
            case "list" -> {
                // 调用personService的getAllPerson方法获取所有人员信息
                ArrayList<Person> persons = personService.getAllPerson();
                // 将获取到的人员信息设置为请求属性
                req.setAttribute("personList", persons);
                // 设置mainRight属性，指定右侧主要内容页面
                req.setAttribute("mainRight", "/jsp/personList.jsp");
                // 转发请求到index.jsp页面
                req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp);
            }
            case "add" -> {
                // 设置mainRight属性，指定右侧主要内容页面
                req.setAttribute("mainRight", "/jsp/addPerson.jsp");
                // 转发请求到index.jsp页面
                req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp);
            }
            case "delete" -> {
                //  删除信息操作
                // 设置响应内容类型为 JSON
                String id = req.getParameter("id");
                resp.setContentType("application/json;charset=UTF-8");
                PrintWriter out = resp.getWriter();
                if (id == null) {
                    out.print("{\"status\":\"error\",\"message\":\"删除失败，请选择要删除的数据。\"}");
                } else {
                    try {
                        // 这里假设你会调用相应的服务层方法进行人员删除操作
                        // 例如：PersonService.deletePerson(id);
                        // 这里为了示例，模拟删除操作成功或失败
                        //boolean success = personService.deletePersonById(id);
                        //人员表代表的type为2
                        boolean success = personService.deletePersonById(user.getId(), user.getName(), 3, 2, id);
                        if (success) {
                            // 删除成功，返回成功信息
                            out.print("{\"status\":\"success\",\"message\":\"删除成功\"}");
                            // resp.sendRedirect("/person.action?action=list");
                        } else {
                            // 删除失败，返回失败信息和原因
                            out.print("{\"status\":\"error\",\"message\":\"删除失败，可能是因为关联数据存在，请先处理关联数据。\"}");
                        }
                    } catch (Exception e) {
                        // 异常处理，返回错误信息
                        out.print("{\"status\":\"error\",\"message\":\"删除操作发生异常，请稍后重试。\"}");
                    }

                }
            }
            case "update" -> {
                try {
                    // 获取员工编号
                    String id = req.getParameter("id");
                    // 调用personService的getPersonById方法根据员工编号获取员工信息
                    Person person = personService.getPersonById(id);
                    // 将获取到的员工信息设置为请求属性
                    logger.info("获取到的员工信息:{}：", person);
                    req.setAttribute("person", person);
                } catch (SQLException e) {
                    // 处理数据库操作异常
                    logger.error("数据库操作异常", e);
                }
                // 设置mainRight属性，指定右侧主要内容页面
                req.setAttribute("mainRight", "/jsp/updatePerson.jsp");
                // 转发请求到index.jsp页面
                req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp);
            }
        }
    }

    /**
     * 处理HTTP POST请求的方法
     *
     * @param req  用于获取请求信息的HttpServletRequest对象
     * @param resp 用于发送响应信息的HttpServletResponse对象
     * @throws IOException 如果发生输入或输出异常
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 设置请求字符编码为UTF-8，以处理中文请求参数
        req.setCharacterEncoding("UTF-8");
        // 设置响应内容类型为text/html，字符编码为UTF-8，以确保浏览器正确显示中文
        resp.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        // 获取请求参数中的action值，用于判断用户想要执行的操作
        String action = req.getParameter("action");
        //获取session
        HttpSession session = req.getSession();
        Person user = null;
        if (session.getAttribute("person") == null) {
            // 重定向到登录页面
            resp.sendRedirect(req.getContextPath() + "/login");
            return;
        } else {
            user = (Person) session.getAttribute("person");
        }
        // 判断action值是否为"save"，如果是，则执行保存人员信息的操作
        if (action.equals("save")) {
            // 从请求参数中获取人员信息
            String id = req.getParameter("id");
            String password = req.getParameter("password");
            String name = req.getParameter("name");
            int age;
            int authorityLevel;
            try {
                age = Integer.parseInt(req.getParameter("age"));
                authorityLevel = Integer.parseInt(req.getParameter("authorityLevel"));
            } catch (NumberFormatException e) {
                logger.error("年龄或权限等级格式错误", e);
                out.print("年龄或权限等级格式错误");
                return;
            }

            // 设置person对象的属性值
            person.setId(id);
            person.setPassword(password);
            person.setName(name);
            person.setAge(age);
            person.setAuthorityLevel(authorityLevel);

            // 调用personService的addPerson方法尝试添加新人员
            //boolean b = personService.addPerson(person);
            boolean b = personService.addPerson(person, user.getId(), user.getName(), 1, 2, id);
            // 根据addPerson方法的返回值判断是否成功添加人员
            if (b) {
                // 如果成功，重定向到人员列表页面
                out.print("保存成功");
            } else {
                // 如果失败，重定向回添加人员页面，并设置错误信息
                out.print("保存失败");
            }
        } else if (action.equals("update")) {
            // 从请求参数中获取修改后的人员信息
            String id = req.getParameter("id");
            String password = req.getParameter("password");
            String name = req.getParameter("name");
            Integer age = Integer.parseInt(req.getParameter("age"));
            int authorityLevel = Integer.parseInt(req.getParameter("authorityLevel"));
            logger.info("获取到的人员信息:{}：", person);
            // 设置person对象的属性值（这里的person可以是已存在的要更新的对象实例，可根据实际情况调整获取方式）
            person.setId(id);
            person.setPassword(password);
            person.setName(name);
            person.setAge(age);
            person.setAuthorityLevel(authorityLevel);

            // 调用personService的updatePerson方法尝试更新人员信息
            boolean b;
            //b = personService.updatePerson(person);
            b = personService.updatePerson(person, user.getId(), user.getName(), 2, 2, id);
            if (b) {
                // 如果更新成功，重定向到人员列表页面
                out.print("修改成功");
            } else {
                // 如果更新失败，重定向回修改页面，并设置错误信息
                out.print("修改失败");
            }
        }
    }
}